﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

//7.自定义异常类；
class MyException
{
public:
	void printError()
	{
		cout << "自定义的异常！" << endl;
	}
};
class PersonException
{
public:
	PersonException()
	{
		cout << "PersonException构造！" << endl;
	}
	~PersonException()
	{
		cout << "PersonException析构！" << endl;
	}
};
int myDevide(int a, int b)
{
	if (b == 0)
	{
		//return -1;

		//3.如果b是异常，抛出异常；int类型异常捕获！
		//throw - 1;
		//4.抛出double类型异常；异常必须处理，如果不处理，就挂掉；
		//throw 3.14;

		//throw 'a';

		//9.栈解旋；从try开始，到throw抛出异常之前，所有栈上的对象，都会被释放；这个过程称为栈解旋；
			//构造和析构顺序相反！
		PersonException p1;
		PersonException p2;

		//8.匿名对象；
		throw MyException();
	}
	return a / b;
}

void testException()
{
	int a = 10;
	//int b = -10;
	int b = 0;

	//1.早期如果返回-1，无法区分到底是结果还是异常；
	//int ret = myDevide(a, b);

	//2.c++中的异常处理；
		//试一试；
	try
	{
		myDevide(a, b);
	}
	//捕获异常；
	catch (int)
	{
		cout << "int类型异常捕获！" << endl;
	}
	catch (double)
	{
		//5.如果不想处理这个异常，可以继续向上抛出；
		throw;
		cout << "double类型异常捕获！" << endl;
	}
	catch (MyException e)
	{
		e.printError();
	}
	catch (...)
	{
		cout << "其他类型异常捕获！" << endl;
	}

}

//main310：异常的基本处理
int main310()
{
	try
	{
		/*PersonException构造！
		PersonException构造！
		PersonException析构！
		PersonException析构！*/
		testException();//int类型异常捕获！ --> double类型异常捕获！ --> 其他类型异常捕获！ --> 自定义的异常！

	}
	//catch (double)
	//6.如果异常都没有处理，那么成员terminate函数，使用程序中断；
	catch (char)
	{
		cout << "main函数中的double类型异常捕获！" << endl;//main函数中的double类型异常捕获！
	}
	catch (...)
	{
		cout << "main函数中的其他类型异常捕获！" << endl;//main函数中的其他类型异常捕获！
	}

	system("pause");
	return EXIT_SUCCESS;
}